package controller;

import entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/5/23 9:01
 * Version:1.0-SNAPSHOT
 * Description:
 */
@Controller
@RequestMapping("/request")
public class RequestController {

    @RequestMapping("/f1")
    public String f1(HttpServletRequest request){
        System.out.println("RequestController.f1");
        User user = new User();
        user.setUsername("admin");
        request.setAttribute("user",user);
        return "scope";
    }

    @RequestMapping("/f2")
    public String f2(User user){
        System.out.println("RequestController.f2");
        user.setUsername("alice");
        return "scope";
    }

    // 当满足以下条件时,默认添加@ModelAttribute注解
    // 1.当前参数没有被任何注解所标注
    // 2.当前参数是一个对象类型
    // 注解的参数默认与变量名一致
    @RequestMapping("/f3")
    public String f3(@ModelAttribute("user") User user){
        System.out.println("RequestController.f3");
        user.setUsername("alice");
        return "scope";
    }

    @RequestMapping("/f4")
    public String f4(@ModelAttribute("u") User user){
        System.out.println("RequestController.f4");
        user.setUsername("tom");
        return "scope";
    }

    @RequestMapping("/f5")
    public String f5(User user) {
        System.out.println("RequestController.f5");
        // 此处不能进行实例化操作
        // 否则会将作用域中存储的对象覆盖
        // 无法再操作request作用域
        user = new User();
        user.setUsername("tom");
        return "scope";
    }


    // @ModelAttribute注解标注在方法上
    // 那么该方法不需要再使用@RequestMapping注解
    // 表示当前方法不是用于直接访问的,而是用于间接访问
    // 当用户访问当前Controller中任意一个方法时
    // 都会先访问被@ModelAttribute标注的方法,然后才会正常访问指定的方法
    @ModelAttribute
    public void f6(){
        System.out.println("RequestController.f6");
    }

    // 当使用ModelAttribute标注方法时
    // 当前方法的返回值会在request作用域中进行读写
    // 其中注解的参数为作用域的key
    // 方法的返回值为作用域的value
    @ModelAttribute("users")
    public List<User> loadUsers(){
        List<User> users = new ArrayList<>();
        User user = new User(1,"admin");
        User user2 = new User(2,"alice");
        User user3 = new User(3,"jack");
        User user4 = new User(4,"tom");
        users.add(user);
        users.add(user2);
        users.add(user3);
        users.add(user4);
        return users;
    }

}
